home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1997 / MacHack 1997.toast / Hacks / Hacks ’93 / DesktopSwitchƒ / DialogRoutines.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-06-17  |  3.9 KB  |  157 lines  |  [TEXT/KAHL]

  1. /*
  2.     DialogRoutines.c - routines which handle default buttons, filtering, etc
  3. */
  4.  
  5. #include "DesktopSwitch.h"
  6. #include "DialogRoutines.h"
  7.  
  8. void DrawDfltBorder(register DialogPtr dptr, short itemNo)
  9. {
  10.     Rect  itemBox;
  11.     ControlHandle  hItem;
  12.     short  dfltItemType, itemType;
  13.     GrafPtr  savedGptr;
  14.  
  15.     GetPort(&savedGptr);
  16.     SetPort(dptr);
  17.     GetDItem(dptr, ((DialogPeek)dptr)->aDefItem, &dfltItemType, (Handle *) &hItem, &itemBox);
  18.     if (itemNo > 0)
  19.         GetDItem(dptr, itemNo, &itemType, (Handle *) &hItem, &itemBox);
  20.     else
  21.         InsetRect(&itemBox, -4, -4);
  22.  
  23.     if (((WindowPeek)dptr)->hilited) {
  24.         Boolean  inColor;
  25.         PenState  pnState;
  26.         RGBColor  savedForeColor;
  27.  
  28.         GetPenState(&pnState);
  29.         if (dfltItemType & itemDisable ||
  30.             (dfltItemType & ctrlItem &&
  31.             (**hItem).contrlHilite >= 254)) {
  32.             long    tmpPat[2];
  33.             Pattern    myGray;
  34.     
  35.             tmpPat[0] = tmpPat[1] = 0xAA55AA55;
  36.             BlockMove((Ptr) tmpPat, (Ptr) &myGray, sizeof(Pattern));
  37.             PenPat((ConstPatternParam)&myGray);
  38.         }
  39.  
  40.         if (inColor = (dptr->portBits.rowBytes & 0xC000) != 0) {
  41.             short  i, ctSz;
  42.             RGBColor  ctlFrameColor;
  43.             ColorSpec  *pCSpec;
  44.             AuxCtlHandle  hACntl;
  45.     
  46.             GetAuxCtl(hItem, &hACntl);
  47.             pCSpec = (*(*hACntl)->acCTable)->ctTable;
  48.             ctlFrameColor = pCSpec->rgb;    /* default color if part not found */
  49.             for (i = 0, ctSz = (*(*hACntl)->acCTable)->ctSize;
  50.                 i <= ctSz; ++i, ++pCSpec)
  51.                 if (pCSpec->value == cFrameColor) {
  52.                     ctlFrameColor = pCSpec->rgb;
  53.                     break;
  54.                 }
  55.             GetForeColor(&savedForeColor);
  56.             RGBForeColor(&ctlFrameColor);
  57.         }
  58.         PenSize(3, 3);
  59.         FrameRoundRect(&itemBox, 16, 16);
  60.         if (inColor)
  61.             RGBForeColor(&savedForeColor);
  62.         SetPenState(&pnState);
  63.     }
  64.     SetPort(savedGptr);
  65. }
  66.  
  67. void FlashBtn(ControlHandle hBtn, short partCode)
  68. {
  69.     long  garbage;
  70.  
  71.     HiliteControl(hBtn, partCode);
  72.     Delay(8L, &garbage);
  73.     HiliteControl(hBtn, 0);
  74. }
  75.  
  76. Boolean StdModHitItem(DialogPtr dptr, short itemNo, Boolean flashIt, 
  77.     short *pItemHit)
  78. {
  79.     Rect  itemBox;
  80.     Handle  hItem;
  81.     short  itemType;
  82.  
  83.     GetDItem(dptr, itemNo, &itemType, &hItem, &itemBox);
  84.     if (itemType & itemDisable)
  85.         return(false);
  86.     if (itemType & ctrlItem)
  87.         if ((*(ControlHandle)hItem)->contrlHilite >= 254)
  88.             return(false);
  89.         else if (flashIt && !(itemType & resCtrl))
  90.             FlashBtn((ControlHandle)hItem,
  91.                 (itemType & (chkCtrl + radCtrl)) ?
  92.                 inCheckBox : inButton);
  93.     *pItemHit = itemNo;
  94.     return(true);
  95. }
  96.  
  97. short GetDCntlKey(DialogPtr dptr, Byte c)
  98. {
  99.     Rect  itemBox;
  100.     Handle  hItem;
  101.     Str255  s;
  102.     short  i, n, itemHit, itemType;
  103.     Byte  myC[2];
  104.  
  105.     myC[0] = 1;
  106.     myC[1] = c;
  107.     
  108.     UprString(myC, false);
  109.     itemHit = 0;
  110.     for (i = 1, n = **(short **)((DialogPeek)dptr)->items + 1; i <= n; i++) {
  111.         GetDItem(dptr, i, &itemType, &hItem, &itemBox);
  112.         if (itemType & ctrlItem) {
  113.             GetCTitle((ControlHandle) hItem, s);
  114.             if (LENGTH(s) && LowerCase(s[1]) == c)
  115.                 UprString(s, false);
  116.                 if (s[1] == myC[1]){
  117.                     if (itemHit)
  118.                         return(0);
  119.                     else
  120.                         itemHit = i;
  121.                 }
  122.         }
  123.     }
  124.     return(itemHit);
  125. }
  126.  
  127. /*-----------------------------------filterProc()-----------------------------------*/
  128.  
  129. #define cancel 2
  130. #define dflt 1
  131.  
  132. pascal Boolean StdFilterProc(DialogPtr dptr, EventRecord *pTheEvent, short *pItemHit)
  133. {
  134.     if (pTheEvent->what == keyDown || pTheEvent->what == autoKey) {
  135.         Byte  c;
  136.         short  hit;
  137.  
  138.         c = (Byte) (pTheEvent->message & 0xff);
  139.         if (c == 13 || c == 3)
  140.             return(StdModHitItem(dptr, ((DialogPeek)dptr)->aDefItem, true, pItemHit));
  141.         else if (c == '.' && (pTheEvent->modifiers & cmdKey))
  142.             return(StdModHitItem(dptr, cancel, true, pItemHit));
  143.         else if (c == 27 &&
  144.             ((pTheEvent->message & keyCodeMask) == 0x00003500))    /* Hard-code ESC key */
  145.             return(StdModHitItem(dptr, cancel, true, pItemHit));
  146.         else if ((((DialogPeek)dptr)->editField == -1) &&
  147.             (hit = GetDCntlKey(dptr, c)))
  148.             return(StdModHitItem(dptr, hit, true, pItemHit));
  149.     }
  150.     else if ((pTheEvent->what == updateEvt) &&
  151.             ((DialogPtr)pTheEvent->message == dptr))  {
  152.             DrawDfltBorder(dptr, 0);
  153.     }
  154.     return(false);
  155. }
  156.  
  157.